#pragma once
#include "common.hpp"

const int gdefaultfd = -1;

class NamedPipe
{
public:
    NamedPipe(std::string name, int fd=gdefaultfd) : _name(name), _fd(fd)
    {
    }
    ~NamedPipe()
    {
    }
    // 创建命名管道
    bool Create()
    {
        // mkpipe(filename,mode)
        int n = mkfifo(_name.c_str(), mode);
        if (n == 0)
        {
            std::cout << "创建命名管道成功" << std::endl;
        }
        else
        {
            perror("mkfifo");
            return false;
        }
        return true;
    }
    // 移除命名管道
    void Remove()
    {
        // unlink(filename);
        int m = unlink(_name.c_str());
        if (m == 0)
        {
            std::cout << "移除管道成功" << std::endl;
        }
        else
        {
            std::cout << "移除管道失败" << std::endl;
        }
    }
    // 打开文件，以读方式
    bool OpenForRead()
    {
        // open(filename , o_RDONLY);
        _fd = open(_name.c_str(), O_RDONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        std::cout << "open files success" << std::endl;
        return true;
    }
    // 打开文件，以写方式
    bool OpenForWrite()
    {
        // open(filename , O_WRONLY);
        _fd = open(_name.c_str(), O_WRONLY);
        if (_fd < 0)
        {
            perror("open");
            return false;
        }
        return true;
    }
    // 读
    bool Read(std::string *out) // 输出型参数
    {
        // read(_fd , buffer , sizeof(buffer)-1);
        char buffer[SIZE];
        buffer[0]=0;
        ssize_t n = read(_fd, buffer, sizeof(buffer) - 1);
        if (n > 0)
        {
            buffer[n] = 0;//手动在字符串结尾添加 \0
            *out = buffer;
        }
        else if(n==0)
        {
            //写端关闭，读端读到文件结尾，即读到0
            return false;
        }
        else{
            //异常
            return false;
        }
        return true;
    }
    // 写
    void Write(const std::string &in) // 输入型参数
    {
        // write(_fd , in.c_str() , in.size());
        write(_fd , in.c_str() , in.size());
    }
    // 关闭文件
    void Close()
    {
        // close(_fd);
        if(_fd == gdefaultfd) return;
        close(_fd);
    }

private:
    std::string _name; // 文件名，可以带上路径，不带就默认未当前路径
    int _fd;
};
